"""
使用residual的跳连接方式,解决多层神经网络时,梯度消失的问题,
保证梯度趋近于1而不是0
residual的计算过程不改变输入的 维度/w/h,本例只使用卷积和激活
"""
import torch
from torch import nn


class ResidualSimple(nn.Module):
    def __init__(self, inputChannel, *args, **kwargs) -> None:
        super().__init__(*args, **kwargs)
        # 定义卷积层1
        self.conv1 = nn.Conv2d(inputChannel, inputChannel, 3, padding=1)
        # 定义卷积层2
        self.conv2 = nn.Conv2d(inputChannel, inputChannel, 3, padding=1)
        # 定义激活
        self.activation = nn.ReLU()

    def forward(self, x):
        # 先经过第一层的卷积->激活
        y = self.activation(self.conv1(x))
        # 经过第二层卷积
        y = self.conv2(y)
        # 跳连接,先和输入叠加
        y += x
        # 进行激活后返回
        return self.activation(y)
